// =================1.通过node.js链接mongodb数据库服务器================
// 1.1引入mongodb模块
const { MongoClient } = require("mongodb"); //解构引入需要的模块
const uri = "mongodb://127.0.0.1:27017"; //设置mongodb服务器地址
const dataBase = "shop"; //设置要连接的数据库的名字

// 1.2获取一个MongoClient对象实例
const client = new MongoClient(uri, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

/*
    1.2获取要连接的数据库
    return 
        promise对象
*/
const connectDB = async () => {
  // 链接数据库
  try {
    // 连接到 MongoDB 服务器
    await client.connect();
    // 选择要操作的库
    const database = client.db(dataBase);
    // 返回连接好的数据库
    return database;
  } catch (error) {
    console.log("mongo服务链接失败！", error);
  }
};

// =================2.封装对于数据库中数据增删改查的方法=================
/*
    2.1查询表中数据的方法
    params:
        collectionName:表名 type：string
        query:执行查询条件 type：{}
        options:制定压迫查询的具体字段 type:{}
    return:
        promise对象
*/
const find = async (collectionName, query = {}, options = {}) => {
  try {
    // 1.连接数据库（ceshi）
    let db = await connectDB();
    // 2.查询ceshi库中的某一个表中的数据记录
    let result = await db
      .collection(collectionName)
      .find()
      // .find(query, options)
      .sort({ shopPrice: -1 })
      .limit(10)
      .toArray();
    return result;
  } catch (error) {
    console.log("查询失败了：", error);
  }
};

/*
    2.2添加表中数据的方法（一条）
    params:
        collectionName:表名 type：string
        values:等待新增的数据 type：{}
    return:
        promise对象
*/
const addOne = async (collectionName, values) => {
  try {
    // 1.连接数据库（ceshi）
    let db = await connectDB();
    // 2.新增一条数据到数据库中的表中
    let result = await db.collection(collectionName).insertOne(values);
    return result;
  } catch (error) {
    console.log("新增失败了：", error);
  }
};

/*
    2.3修改表中数据的方法（一条）
    params:
        collectionName:表名 type：string
        filter:修改数据的条件 type：{}
        updateDoc:待修改的数据 type:{$set:{}}
    return:
        promise对象
*/
const editOne = async (collectionName, filter, updateDoc) => {
  try {
    // 1.连接数据库（ceshi）
    let db = await connectDB();
    // 2.修改一条数据到数据库中的表中
    let result = await db
      .collection(collectionName)
      .updateOne(filter, updateDoc);
    return result;
  } catch (error) {
    console.log("修改失败了：", error);
  }
};

/*
    2.4删除表中数据的方法（一条）
    params:
        collectionName:表名 type：string
        filter:删除数据的条件 type：{}
    return:
        promise对象
*/
const reomveOne = async (collectionName, filter) => {
  try {
    // 1.连接数据库（ceshi）
    let db = await connectDB();
    // 2.修改一条数据到数据库中的表中
    let result = await db.collection(collectionName).deleteOne(filter);
    return result;
  } catch (error) {
    console.log("删除失败了：", error);
  }
};

// ================3.导出封装的函数====================================
module.exports = {
  connectDB,
  find,
  addOne,
  editOne,
  reomveOne
};
